package com.example.sxt_practise.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author gaofeng
 * @date 2022年06月05日 16:42
 */
public class ReflectDemo {
    public static void main(String[] args) throws Exception {

        @SuppressWarnings("all")
        Class<Student> stu = (Class<Student>) Class.forName("Student");

        // 实际调用的是Student的无参构造方法
        Student student = stu.newInstance();
        System.out.println(student.getName());

        // 通过反射调用有参构造方法,创建对象
        Constructor<Student> constructor = stu.getDeclaredConstructor(int.class, String.class, String.class);
        Student student1 = constructor.newInstance(1, "gao", "feng");
        System.out.println(student1.getName());

        // 反射调用普通方法
        Method setAge = stu.getDeclaredMethod("setAge", int.class);
        setAge.invoke(student, 11) ;
        System.out.println(student.getAge());

        // 通过反射操作属性
        Field name = stu.getDeclaredField("name");
        // 启用或禁用安全检查的开关 , 设为true, 指反射的对象在使用时应该取消java语言访问检查
        name.setAccessible(true);
        name.set(student, "gaoFengYids");
        System.out.println(student.getName());


    }
}
